/*
 * InterfazCliente.h
 *
 *  Created on: Jan 25, 2010
 *      Author: jgrande
 */

#ifndef MIDDLEWARECLIENTE_H_
#define MIDDLEWARECLIENTE_H_

#include <unistd.h>

#include "MiddlewareIO.h"

#include "../Common/Config.h"
#include "../Common/Mensaje.h"
#include "../Common/CommonTypes.h"

#include "../../Framework/Common/TemplateSingleton.h"

#include "../../Framework/Shared/msgqueue.h"
#include "../../Framework/Shared/sem.h"

#include "../../Framework/IO/log.h"

using middleware::common::Longitud;
using middleware::common::Operacion;
using middleware::common::MapaLineasTCP;
using middleware::common::ListaReceptores;
using middleware::common::Secuencia;
using middleware::common::PDUPuntoAPunto;

using framework::io::logger;
using framework::io::LogType;

using middleware::Mensaje;

class MiddlewareCliente : public MiddlewareIO, private Singleton {
	pid_t pidALC, pidAceptor;
	MessageQueue qrcv, qsnd, qalc, qrng;
	Direccion dirLocal;
	Semaphore sem;
	MapaLineasTCP lineasTCP;
	ListaReceptores listaReceptores;
	Secuencia proxSecuencia;
	bool proxSecuenciaInicializado;

	MiddlewareCliente(const MiddlewareCliente&);
	MiddlewareCliente& operator=(const MiddlewareCliente&);

public:

	MiddlewareCliente();
	~MiddlewareCliente();

	bool start();

	void finish();

	bool send(const Mensaje& msj, Direccion destino, Operacion op = middleware::common::OP_DATA);

	bool send(void* datos, Longitud ldatos, Direccion destino) {
		return this->send(datos, ldatos, destino, middleware::common::OP_DATA);
	}

	bool send(const void* datos, Longitud ldatos, Direccion destino, Operacion op);

	bool sendMulticast(const void* datos, Longitud ldatos, Direccion destino);

	bool recv(void* datos);

	bool recvMulticast(void* datos);

	MessageQueue& getRcv() { return qrcv; }

	MessageQueue& getSnd() { return qsnd; }

	MessageQueue& getAlc() { return qalc; }

	MessageQueue& getRng() { return qrng; }

	Semaphore& getSem() { return sem; }

	MapaLineasTCP& getLineas() { return lineasTCP; }

	ListaReceptores & getListaReceptores() { return listaReceptores; }
};

typedef SingletonTemplate<MiddlewareCliente> MiddlewareClienteSingleton;

#endif /* MIDDLEWARECLIENTE_H_ */
